package com.rado.tf.gui.view.sampleValidation.impl;

import com.rado.tf.gui.i18n.MessageSource;
import com.rado.tf.gui.view.common.impl.AbstractViewImpl;
import com.rado.tf.gui.view.sampleValidation.ISampleValidationView;
import com.vaadin.data.Validator;
import com.vaadin.data.validator.EmailValidator;
import com.vaadin.data.validator.IntegerRangeValidator;
import com.vaadin.data.validator.StringLengthValidator;
import com.vaadin.ui.Button;
import com.vaadin.ui.FormLayout;
import com.vaadin.ui.TextField;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;

/**
 * Created by parado on 18.03.14.
 */
@Component(SampleValidationViewImpl.BEAN_NAME)
public class SampleValidationViewImpl extends AbstractViewImpl implements ISampleValidationView
{
   public static final String BEAN_NAME = "sampleValidationView";

   @Resource
   private MessageSource messageSource;

   @Override
   @PostConstruct
   public void init()
   {
      setSpacing(true);
      setMargin(true);
      FormLayout form = new FormLayout();
      addComponent(form);

      TextField integerField = new TextField("Integer w przedziale (0-99)");
      integerField.setConverter(Integer.class);
      integerField.setConversionError("Nie można skonwertować wartości do Integer");
      integerField.setNullRepresentation("");
      integerField.addValidator(
              new IntegerRangeValidator(messageSource.getMessage("sample.form.0.99.integer.invalid"), 0, 99));
      integerField.setImmediate(true);
      form.addComponent(integerField);

      final TextField stringField = new TextField("String (5-7)");
      stringField.addValidator(new StringLengthValidator("Wymagana długość to (5-7)", 5, 7, true));
      stringField.setImmediate(true);
      stringField.setNullRepresentation("");
      form.addComponent(stringField);

      TextField helloField = new TextField("Hello field: ");
      helloField.setImmediate(true);
      helloField.addValidator(new Validator()
      {
         @Override
         public void validate(Object value) throws InvalidValueException
         {
            if (!(value instanceof String && "hello".equals(value)))
            {
               throw new InvalidValueException("Nieprawidłowa wartość!");
            }
         }
      });
      form.addComponent(helloField);

      TextField emailField = new TextField("Email");
      emailField.addValidator(new EmailValidator("Nieprawidłowy format adresu email"));
      emailField.setImmediate(true);
      form.addComponent(emailField);

      final TextField manualStringField = new TextField("String długości (1-10) - ręczna walidacja: ");
      form.addComponent(manualStringField);
      manualStringField.addValidator(new StringLengthValidator(
              "Wymagany String długości (1-10)", 1, 10, true));
      manualStringField.setValidationVisible(false);
      Button validate = new Button("Waliduj ostatnie pole!");
      validate.addClickListener(new Button.ClickListener()
      {
         @Override
         public void buttonClick(Button.ClickEvent event)
         {
            manualStringField.setValidationVisible(false);
            try
            {
               manualStringField.validate();
            }
            catch (Validator.InvalidValueException e)
            {
               manualStringField.setValidationVisible(true);
            }
         }
      });
      form.addComponent(validate);
   }
}
